home *** CD-ROM | disk | FTP | other *** search
/ Penthouse Guide to Cybersex / Penthouse Guide to Cybersex.iso / pc / pho / phos.lzh / NEWSETUP.C < prev    next >
C/C++ Source or Header  |  1994-07-27  |  60KB  |  1,888 lines

  1. /**
  2. *** NEWSETUP.C  --  signup program******  Ken Sedlund  Oct, 1993
  3. ***
  4. **/
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <conio.h>
  8. #include <bios.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <io.h>         /**  access function  **/
  12. #include <process.h>    /**  spawn function  **/
  13. #include <dos.h>        /**  sleep function  **/
  14. #include <mem.h>        /**  memset function **/
  15. #include <ctype.h>      /**  isalpha function **/
  16.  
  17. #include "g4char.h"
  18. #include "ctext.h"       /**  text functions  **/
  19. #include "comm.c"        /** include comm functions **/
  20.  
  21. #define VERSION "Version 1.00.01"
  22.  
  23. #define INFO_RETURN       0x1C0D
  24. #define TOP_OFFSET        8
  25. #define BOTTOM_OFFSET     4
  26.  
  27. #define README_FILE      "newsetup.txt"
  28. #define PHONE_FILE       "phone.lst"
  29. #define INSTRU_FILE      "instru.txt"
  30. #define LINES_PER_SCREEN 17
  31. #define MAX_LINES        800
  32. #define MAX_LINE_LEN     80
  33. #define INVALID          -1
  34. #define SUCCESS          0
  35. #define ERROR            1
  36. #define ERROR2           2
  37. #define MAX_COM_NUM      4
  38. #define NUM_SPD_TYPE     5
  39. #define COM_FOUND        2
  40. #define MODEM_FOUND      1
  41.  
  42. // exact length for each entry in $$ddir.trm and $$curset.trm files
  43. #define DDIR_ENTRY_LEN   160
  44. #define CURSET_LEN        10
  45. // exact length for each field in $$ddir.trm file
  46. #define SETUP_NAME_LEN    21
  47. #define PHONE_NUM_LEN     27
  48. #define INIT_CMD_LEN      21
  49. #define PORT_INFO_LEN      9
  50. #define ID_LEN            13
  51. #define PWD_LEN            9
  52. #define X25_TYPE_LEN       2
  53. #define X25_HOST_LEN      21
  54. #define X25_PWD_LEN       21
  55. #define UNDEFINED_FLD_LEN 16
  56.  
  57. typedef struct term_ts         /* entry structure for $$ddir.trm file */
  58. {                                             // position
  59.     char setup_name[SETUP_NAME_LEN];          //   1 -  21
  60.     char phone_num[PHONE_NUM_LEN];            //  22 -  48
  61.     char init_cmd[INIT_CMD_LEN];              //  49 -  69
  62.     char port_info[PORT_INFO_LEN];            //  70 -  78
  63.     char id[ID_LEN];                          //  79 -  91
  64.     char pwd[PWD_LEN];                        //  92 - 100
  65.     char x25_type[X25_TYPE_LEN];              // 101 - 102
  66.     char x25_host[X25_HOST_LEN];              // 103 - 123
  67.     char x25_pwd[X25_PWD_LEN];                // 124 - 144
  68.     char undefined_fld[UNDEFINED_FLD_LEN];    // 145 - 160
  69. } term_s;
  70.  
  71. int FileCopy( const char *source, const char *dest );
  72.  
  73. int  NewSetup( void );
  74. int  GetSetupName( void );
  75. int  GetId( void );
  76. int  GetPwd( void );
  77. int  IdPwdSetupPrompt(int x, int y, int length, char *str, int IdPwdSetup);
  78. int  ValidIdPwd(char *str);
  79. int  IsInsertPwd( void );
  80. int  GetComPort( void );
  81. int  SearchPort( int *com);
  82. int  SearchModem(int comport, long speed, char *init_str);
  83. int  GetModemInitStr( char port );
  84. int  ValidInitStr( char *init_str, char port);
  85. int  GetBaudRate( void );
  86. //int  PromptPhoneNum( void );
  87. //int  GetPhoneStr( int x );
  88. //int  ValidPhoneNum(char *phonestr);
  89. int  SetupFiles( void );
  90. void PutStr(char *source, char *destination, int dest_len, FILE *fp);
  91.  
  92. int  Info( int found );
  93. int  Info2( int found );
  94. int  Display( int start, int bottom );
  95. int  LoadFile( char *fname );
  96. int  GetFile( char *filename );
  97. int  GetNum( int info1_2 );
  98. int  GetLocalPhone( char *num, int info1_2 );
  99. void kill_data( char **data );
  100. void HighliTxt(int line_number, int positiony, int bgcolor, int txtcolor);
  101. int  SelectedTxt(int line_number, int y);
  102.  
  103. WINDOW top  = {2,2,78,5};
  104. WINDOW menu = {1,7,80,24};
  105.  
  106. extern char *sys_errlist[];
  107. extern int errno;
  108. char   **file_buffer = (char**) NULL;
  109. int    num_lines;
  110. char   area_code[4];
  111.  
  112. term_s term;                       // global structure for $$ddir.trm file
  113.  
  114. char   select_com;                 // selected serial port
  115. char   modem_resp[1024];           // modem response string
  116. char   service[MAX_LINE_LEN];      // online service name
  117. int    ispwd;
  118.  
  119. /**
  120. ***  main  --  main routine
  121. **/
  122. void main( void )
  123. {
  124.      int      savex, savey, ans, key, Ok = 0, ret, i;
  125.      struct   text_info t;
  126.      unsigned char saveattr;
  127.      WINDOW   w = {1,1,80,25};
  128.  
  129.      gettextinfo( &t );
  130.      saveattr = t.attribute;
  131.  
  132.      highvideo();
  133.      colorbackground( BLUE );
  134.      window( 1,1,80,25 );
  135.      clrscr();
  136.      cputsxy(64,1,VERSION);
  137.      colorwindow( top, CYAN, -1, 1 );
  138.  
  139.      memset(&term,0,sizeof(term_s));     // intialize structure
  140.  
  141.      cputs_center( 2, "Create X.25 Setups" );
  142.  
  143.      if ( access( "$$ddir.trm", 00 ) != 0 )
  144.      {
  145.           colorwindow( menu, BLUE, -1, 0 );
  146.           textcolor(WHITE);
  147.           cputs_center(6, "Cannot find <$$ddir.trm> file in the current directory.");
  148.           cputs_center(8, "Be sure to copy the X.25 Setup software files to the");
  149.           cputs_center(10,"Access software directory and run it from there.");
  150.           cputs_center(12,"Press any key to quit");
  151.           no_cursor();
  152.           getch();
  153.           colorwindow( w, BLACK, -1, 0 );
  154.           clrscr();
  155.           exit(0);
  156.      }
  157.  
  158.      for( ;; )
  159.      {
  160.           Ok = 0;
  161.           colorwindow( menu, BLUE, -1, 0 );
  162.           textcolor(WHITE);
  163.           cputsxy( 30, 5, "F1   INFORMATION" );
  164.           cputsxy( 30, 7, "F2   CREATE NEW SETUP" );
  165.           cputsxy( 30, 9, "F3   PHONE BOOK" );
  166.           cputsxy( 30, 11,"ESC  EXIT" );
  167.           no_cursor();
  168.  
  169.           while( !Ok )
  170.           {
  171.                while( bioskey(1) == 0);
  172.                key = bioskey(0);
  173.                switch( key )
  174.                {
  175.                     case F2 :
  176.                          ret = NewSetup( );    // create new setup
  177.                          if (ret == SUCCESS)
  178.                          {
  179.                               colorwindow( menu, BLUE, -1, 0 );
  180.                               cputs_center( 5, "A new setup has been created.");
  181.                               cputs_center( 7, "Press ESC to quit, press ENTER "
  182.                                                "to run the Access software." );
  183.                               cputs_center( 9, "At Access Screen, "
  184.                                                "press 'C' to connect" );
  185.                               cputs_center(11, "If you have any problem, "
  186.                                   "contact customer service at 1-800-547-4727");
  187.                               do
  188.                               {
  189.                                    no_cursor();
  190.                                    key=getch();
  191.                               } while (key != ESC && key != RETURN);
  192.                       ///        sleep( 1 );
  193.                       ///        if( bioskey(1) ) bioskey(0);
  194.                       ///        key=getch();
  195.                               if (key!=ESC)
  196.                               {
  197.                                    colorwindow( w, BLACK, -1, 0 );
  198.                                    if( spawnl( P_WAIT, "terminal.exe", NULL ) < 0 )
  199.                                    {
  200.                                         cputs_center( 16, "ERROR - spawn terminal.exe : %s",
  201.                                                   sys_errlist[errno] );
  202.                                         cputs_center( 17, "Press any key");
  203.                                         no_cursor();
  204.                                         getch();
  205.                                    }
  206.                               }
  207.                               colorwindow( w, BLACK, -1, 0 );
  208.                               clrscr();
  209.                               exit(0);
  210.                          }
  211.                          Ok = 1;
  212.                          break;
  213.  
  214.                     case F1 :
  215.                          if( GetFile( README_FILE ) <= 0 )
  216.                               break;
  217.                          Info(1);
  218.                          Ok = 1;
  219.                          kill_data( file_buffer );
  220.                          break;
  221.  
  222.                     case F3 :
  223.                          GetNum( 1 );
  224.                          kill_data( file_buffer );
  225.                          Ok = 1;
  226.                          break;
  227.  
  228.                     case ESC_SCAN:
  229.                          /*kill_data( file_buffer );*/
  230.                          window( 1,1,80,25 );
  231.                          textattr( saveattr );
  232.                          clr_line( 25 );
  233.                          gotoxy( 1, 24 );
  234.                          exit(0);
  235.                }  /**  END switch key **/
  236.           }  /**  END while !Ok  **/
  237.      }  /**  END for ;;  **/
  238. }  /**  END function main  **/
  239.  
  240. /**
  241. ***  NewSetup  --  instruct user step by step to create a new setup
  242. **/
  243. int NewSetup( )
  244. {
  245.      int i, savex, savey, ret, key, ans, code = SUCCESS;
  246.  
  247. //     colorwindow( menu, BLUE, -1, 0 );
  248. //     textcolor(WHITE);
  249.  
  250.      if (GetSetupName() == ERROR)
  251.           return ERROR;
  252.  
  253.      textcolor(WHITE); // reset text color
  254.  
  255.      // create a new setup entry
  256.      if (( code = SetupFiles( )) == ERROR )
  257.      {
  258.           cputs_center( 16, "Error in creating new setup.  Contact customer "
  259.                             "service at 1-800-547-4727");
  260.           cputs_center( 17, "Press any key");
  261.           no_cursor();
  262.           getch();
  263.      }
  264.  
  265.      return( code );
  266. }
  267.  
  268. /**
  269. ***  GetSetupName --  prompt user for new setup name
  270. **/
  271. int GetSetupName( )
  272. {
  273.      int  savex, savey, x, y, i, j, eol, ans, ret;
  274.      char setup[SETUP_NAME_LEN];
  275.  
  276.      for (;;)
  277.      {
  278.           colorwindow( menu, BLUE, -1, 0 );
  279.           textcolor(WHITE);
  280.           cputs_center( 11, "Press ESC to go back" );
  281.           cputsxy(20,5, "Enter new SETUP NAME: " );
  282.           x = wherex();
  283.           y = wherey()+6;
  284.           if ( IdPwdSetupPrompt(x,y,SETUP_NAME_LEN,setup,2) == SUCCESS)
  285.                strcpy(term.setup_name,setup); // save to global
  286.           else return ERROR;
  287.           ret = GetId();  // get password
  288.           if (ret == SUCCESS)
  289.                break;
  290.      } // for (;;)
  291.      return SUCCESS;
  292. }
  293.  
  294.  
  295. /**
  296. ***  GetId  --  prompt user for id
  297. **/
  298. int GetId( )
  299. {
  300.      int  savex, savey, x, y, i, j, eol, ans, ret;
  301.      char id[ID_LEN];
  302.  
  303.      for (;;)
  304.      {
  305.           colorwindow( menu, BLUE, -1, 0 );
  306.           textcolor(WHITE);
  307.           cputs_center( 11, "Press ESC to go back" );
  308.           cputsxy(20,5, "       Enter your ID: " );
  309.           x = wherex();
  310.           y = wherey()+6;
  311.           if ( IdPwdSetupPrompt(x,y,ID_LEN,id,1) == SUCCESS)
  312.                strcpy(term.id,id); // save to global
  313.           else return ERROR;
  314.           ret = GetPwd();  // get password
  315.           if (ret == SUCCESS)
  316.                break;
  317.      } // for (;;)
  318.      return SUCCESS;
  319. }
  320.  
  321. /**
  322. ***  GetPwd  --  prompt user for password
  323. **/
  324. int GetPwd( )
  325. {
  326.      int  savex, savey, x, y, i, j, eol, ans, ret;
  327.      char pwd[PWD_LEN];
  328.  
  329.      for (;;)
  330.      {
  331.           memset(term.pwd,NULL,PWD_LEN);
  332.           if ( IsInsertPwd() == ERROR )
  333.                return ERROR;
  334.  
  335.           if (ispwd)
  336.           {
  337.                colorwindow( menu, BLUE, -1, 0 );
  338.                textcolor(WHITE);
  339.                cputs_center( 11, "Press ESC to go back" );
  340.                cputsxy(20,5, "       Enter your PASSWORD: " );
  341.                x = wherex();
  342.                y = wherey()+6;
  343.                if ( IdPwdSetupPrompt(x,y,PWD_LEN,pwd,0) == SUCCESS)
  344.                     strcpy(term.pwd,pwd); // save to global
  345.                else return ERROR;
  346.           }
  347.           ret = GetComPort();  // get com ports
  348.           if (ret == SUCCESS)
  349.                break;
  350.      } // do loop
  351.      return SUCCESS;
  352. }
  353.  
  354. int IdPwdSetupPrompt(int x, int y, int length, char *str, int IdPwdSetup)
  355. {
  356.      int i, eol, savex, savey, tempx, tempy, ret = SUCCESS;
  357.      char temp[30];
  358.      memset(temp,NULL,30);
  359.      memset(str,NULL,length);
  360.      if (IdPwdSetup == 2)  // setupname
  361.           strcpy(str,term.setup_name);
  362.      else if (IdPwdSetup == 1)
  363.           strcpy(str,term.id);
  364.      do
  365.      {
  366.           eol = i = 0;
  367.           window(x,y,x+length-1,y);
  368. //          textbackground(RED);
  369. //          textcolor(YELLOW);
  370.           textattr(0x4E);
  371.           if (IdPwdSetup)
  372.           {
  373.                cputs(str);
  374.                i = strlen(str);
  375.           }
  376.           savex = wherex();
  377.           savey = wherey();
  378.           do {
  379.                gotoxy( savex, savey );
  380.                clreol();
  381.                if ( i == length-1 )
  382.                {
  383.                     if (IdPwdSetup)
  384.                     {
  385.                          str[length-1]=NULL;
  386.                          cputsxy(1,1,str);
  387.                     }
  388.                     else
  389.                     {
  390.                          temp[length-1]=NULL;
  391.                          cputsxy(1,1,temp);
  392.                     }
  393.                }
  394.                if (IdPwdSetup)
  395.                     str[i] = getche() ;
  396.                else
  397.                {
  398.                     str[i] = getch() ;
  399.                     if (str[i] != BACK_SPACE && str[i] != RETURN)
  400.                     {
  401.                          temp[i]='*';
  402.                          tempx=wherex()-1;tempy=wherey()-1;
  403.                          gotoxy(tempx,tempy);
  404.                          cputs("*");
  405.                     }
  406.                }
  407.  
  408.                switch( str[i] )
  409.                {
  410.                     case ESC: return ERROR;
  411.                     case RETURN : eol = 1;  break;
  412.                     case BACK_SPACE :
  413.                          if( i > 0 )
  414.                          {
  415.                               savex--; i--;
  416.                          }
  417.                          break;
  418.                     default :
  419.                          if ( i < length-1 )
  420.                          {
  421.                               savex++; i++;
  422.                          }
  423.                }
  424.           } while( !eol );
  425.           str[i]=NULL;
  426.           if (IdPwdSetup != 2)
  427.                ret = ValidIdPwd(str);
  428.      } while (ret == INVALID);
  429.      return SUCCESS;
  430. }
  431.  
  432. /**
  433. ***  ValidIdPwd  --  check for empty or leading blank password and id
  434. **/
  435. int ValidIdPwd(char *str)
  436. {
  437.      int ret = SUCCESS;
  438.      if (strlen(str) == 0)  // empty string
  439.           ret = INVALID;
  440.  
  441.      if (str[0] == ' ')     // leading blank string
  442.           ret = INVALID;
  443.      if (ret == INVALID)
  444.      {
  445.           window(1,24,80,24);
  446. //          textcolor(WHITE);
  447. //          textbackground(BLUE);
  448.           textattr(0x1F);
  449.           cputs_center(1,"Invalid string.  Press any key");
  450.           no_cursor();
  451.           getch();
  452.           window(1,24,80,24);
  453.           clrscr();
  454.           return ret;
  455.  
  456.      }
  457.      return ret;
  458. }
  459.  
  460. /**
  461. ***  IsInsertPwd  --  ask if user want to insert password into setup file
  462. **/
  463. int IsInsertPwd( )
  464. {
  465.      int savex, savey, ans;
  466.  
  467.      colorwindow( menu, BLUE, -1, 0 );
  468.      textcolor(WHITE);
  469.      cputs_center( 7, "ESC to go back");
  470.      textcolor(YELLOW);
  471.      cputsxy(3,17, "NOTE: If you choose 'N', you will be asked for "
  472.                     "password each time you logon.");
  473.      textcolor(WHITE);
  474.      cputs_center( 5, "Put password into the new setup [Y/N]: ");
  475.      savex = wherex();
  476.      savey = wherey();
  477.      for (;;)
  478.      {
  479.           gotoxy( savex, savey );
  480.           clreol();
  481.           if ((ans=getche()) == ESC)
  482.                return ERROR;
  483.           if (ans == 'y' || ans =='Y' || ans == 'n' || ans == 'N')
  484.           {
  485.                if (ans == 'y' || ans == 'Y')
  486.                     ispwd = 1;
  487.                else
  488.                     ispwd = 0;
  489.                delay( 300 );
  490.                break;
  491.           }
  492.      } // for (;;)
  493.      return SUCCESS;
  494. }
  495.  
  496. /**
  497. ***  GetComPort  --  get available serial communication ports
  498. **/
  499. int GetComPort( )
  500. {
  501.      int  i, j, ret, savex, savey, com_found, is_modem, eol;
  502.      int  com[MAX_COM_NUM];
  503.      char temp[2];
  504.  
  505.      for (;;)
  506.      {
  507.           colorwindow( menu, BLUE, -1, 0 );
  508.           textcolor(WHITE);
  509.           is_modem = com_found = 0;
  510.           cputs_center(5, "Searching for COM port(s), please wait...");
  511.           no_cursor();
  512.  
  513.           // search ports availability
  514.           if ( (ret=SearchPort(com)) > 0 )
  515.                com_found = 1;
  516.  
  517.           // search modem availability
  518.           for (i=0;i<MAX_COM_NUM;++i)
  519.                if (com[i])
  520.                     if ( (com[i]=SearchModem(i+1,2400,"AT")) == 1)
  521.                          is_modem = 1;
  522.                     else
  523.                          if ((com[i]=SearchModem(i+1,2400,"ATE1Q0")) == 1)
  524.                               is_modem = 1;
  525.           for (i=0;i<MAX_COM_NUM;++i)
  526.                if (!com[i])
  527.                     if ( (com[i]=SearchModem(i+1,2400,"AT")) == 1)
  528.                          is_modem = 1;
  529.                     else
  530.                          if ((com[i]=SearchModem(i+1,2400,"ATE1Q0")) == 1)
  531.                               is_modem = 1;
  532.                          else
  533.                               com[i]=0;
  534.           clr_line(5);
  535.           if (!com_found)
  536.           {
  537.                textcolor(YELLOW);
  538.                cputs_center( 5, "No COM port found" );
  539.                textcolor(WHITE);
  540.                cputs_center( 7, "Press ESC to go back" );
  541.                return ERROR;
  542.           }
  543.           else
  544.           {
  545.                cputs_center( 9, "Press ESC to go back" );
  546.                cputs_center( 5, "Found following COM port(s): " );
  547.                for (i=0;i<MAX_COM_NUM;++i)
  548.                     if (com[i]) cprintf("%d ",i+1);
  549.                textcolor(YELLOW);
  550.                if (is_modem)
  551.                {
  552.                     cputs_center( 7, "Found modem in COM ports: " );
  553.                     for (i=0;i<MAX_COM_NUM;++i)
  554.                          if (com[i]==MODEM_FOUND) cprintf("%d ",i+1);
  555.                }
  556.                else
  557.                     cputs_center( 7, "Modem is not found or not ready");
  558.                textcolor(WHITE);
  559.                cputs_center( 11, "Enter COM port number: ");
  560.           }
  561.           savex = wherex();
  562.           savey = wherey();
  563.           window(savex,savey+6,savex+1,savey+6);
  564. //          textbackground(RED);
  565. //          textcolor(YELLOW);
  566.           textattr(0x4E);
  567.           savex = wherex();
  568.           savey = wherey();
  569.           i = eol = 0;
  570.           do
  571.           {
  572.                gotoxy( savex, savey );
  573.                clreol();
  574.                if ( i == 1 )
  575.                {
  576.                     temp[1]=NULL; cputsxy(1,1,temp);
  577.                }
  578.                temp[i] = getche() ;
  579.                switch( temp[i] )
  580.                {
  581.                     case ESC : return ERROR;
  582.                     case RETURN :
  583.                          if ( i > 0 )
  584.                          {
  585.                               j=atoi(temp)-1;
  586.                               if (j >= 0 && j < MAX_COM_NUM)
  587.                                    if (com[j])
  588.                                         eol = 1;
  589.                          }
  590.                          break;
  591.                     case BACK_SPACE :
  592.                          if( i > 0 )
  593.                          {
  594.                               savex--; i--;
  595.                          }
  596.                          break;
  597.                     default :
  598.                          if( i < 1 )
  599.                          {
  600.                               savex++; i++;
  601.                          }
  602.                }
  603.           } while( !eol );
  604.  
  605.           switch (temp[0])  // save to global
  606.           {
  607.                case '1': term.port_info[1] = 0x01; break;
  608.                case '2': term.port_info[1] = 0x02; break;
  609.                case '3': term.port_info[1] = 0x03; break;
  610.                case '4': term.port_info[1] = 0x04; break;
  611.                default : term.port_info[1] = 0x00; break;
  612.           }
  613.  
  614.           ret = GetModemInitStr(temp[0]);
  615.           if (ret == SUCCESS)
  616.                break;
  617.      } // for (;;)
  618.  
  619.      select_com = temp[0];
  620.      return SUCCESS;
  621. }
  622.  
  623. /**
  624. ***  SearchPort  --  search for available ports
  625. **/
  626. int SearchPort(int *com)
  627. {
  628.      int  i, found = 0;
  629.      char tempstr[256];
  630.      int  portbase;
  631.      int  far *bda;
  632.  
  633.      for (i=0;i < MAX_COM_NUM; ++i)
  634.           com[i] = 0;
  635.  
  636.      for (i=0;i < MAX_COM_NUM; ++i)
  637.      {
  638.           bda =(int far *)MK_FP(0x40, i*2 );
  639.           portbase = *bda;
  640.           sprintf(tempstr,"%04X",portbase);
  641.           if (!strcmp("03F8",tempstr))
  642.           {
  643.                found = 1;
  644.                com[0] = COM_FOUND;
  645.           }
  646.           else if (!strcmp("02F8",tempstr))
  647.           {
  648.                found = 1;
  649.                com[1] = COM_FOUND;
  650.           }
  651.           else if (!strcmp("03E8",tempstr))
  652.           {
  653.                found = 1;
  654.                com[2] = COM_FOUND;
  655.           }
  656.           else if (!strcmp("02E8",tempstr))
  657.           {
  658.                found = 1;
  659.                com[3] = COM_FOUND;
  660.           }
  661.      }
  662.      return found;
  663. }
  664.  
  665. /**
  666. ***  SearchModem  --  search for modem
  667. **/
  668. int SearchModem(int comport, long speed, char *init_str)
  669. {
  670.      int  i, j;
  671.      int  found = COM_FOUND; // COM port is assummed found
  672.                              // before searching for modem
  673.      char tempstr[256];
  674.      unsigned a, a1;
  675.  
  676.      memset(modem_resp,NULL,1024);
  677.  
  678.      open_comm(comport,speed,1);   // open com port
  679.      flush_comm_buffer();          // clear buffer
  680.  
  681.      /* turn on Data Terminal Ready */
  682.      raise_dtr();
  683.  
  684.      sprintf(tempstr,"%s\r",init_str);
  685.      i = j = 0;
  686.      for (;;)
  687.      {
  688.           if(comm_char())      /* if a character has been received */
  689.           {
  690.                a=comm_in();
  691.                if ( j < 1024 )
  692.                     modem_resp[j] = a;
  693.                ++j;
  694.  
  695.                if (a1=='O' && a=='K')
  696.                {
  697.                     found=MODEM_FOUND; break;
  698.                }
  699.                a1=a;
  700.           }
  701.           if (i<strlen(tempstr))
  702.           {
  703.                comm_out(tempstr[i]);
  704.                delay(300);
  705.           }
  706.           ++i;
  707.           if (i>strlen(tempstr)+3072) break; // less buffer < 4k
  708.      } // for(;;)
  709.      /* turn off Data Terminal Ready */
  710.      drop_dtr();
  711.  
  712.      /* close the port and exit */
  713.      close_comm();
  714.  
  715.      return found;
  716. }
  717.  
  718. /**
  719. ***  --  GetModemInitStr  --  get modem init string
  720. **/
  721. int GetModemInitStr(char port)
  722. {
  723.      int  x, y, savex, savey, i, j, eol, key, ret, ans;
  724.      char initstr[INIT_CMD_LEN];
  725.  
  726.      do
  727.      {
  728.           colorwindow( menu, BLUE, -1, 0 );
  729.           textcolor(YELLOW);
  730.           cputsxy(1,2,"  NOTE: Some modems need a special initialization string "
  731.                       "to operate properly");
  732.           cputsxy(1,3,"  with the access software.  Most will work with the "
  733.                       "default init string of ");
  734.           cputsxy(1,4,"  'AT&F'.");
  735.           cputsxy(1,14,"  If you need assistance building a modem init string, "
  736.                       "please call customer");
  737.           cputsxy(1,15,"  service at 1-800-547-4727.");
  738.           textcolor(WHITE);
  739.           strcpy(initstr,"AT&F");
  740.           cputs_center( 8, "Press ESC to go back" );
  741.           cputsxy(15,6, "Enter your modem init string: " );
  742.  
  743.           x = savex = wherex();
  744.           y = savey = wherey();
  745.           for (;;)   // for loop1
  746.           {
  747.                eol = 0;
  748.                i = strlen(initstr);
  749.                window(x,y+6,x+INIT_CMD_LEN-1,y+6);
  750. //               textbackground(RED);
  751. //               textcolor(YELLOW);
  752.                textattr(0x4E);
  753.                cputs( initstr ); // display default init string
  754.                savex=wherex();
  755.                savey=wherey();
  756.                do {
  757.                     gotoxy( savex, savey );
  758.                     clreol();
  759.                     if ( i == INIT_CMD_LEN-1 )
  760.                     {
  761.                          initstr[INIT_CMD_LEN-1] = NULL;
  762.                          cputsxy(1,1,initstr);
  763.                     }
  764.                     initstr[i] = getche() ;
  765.                     switch( initstr[i] )
  766.                     {
  767.                          case ESC : return ERROR;
  768.                          case RETURN : eol = 1;  break;
  769.                          case BACK_SPACE :
  770.                               if( i > 0 )
  771.                               {
  772.                                    savex--; i--;
  773.                               }
  774.                               break;
  775.                          default :
  776.                               if ( i < INIT_CMD_LEN-1 )
  777.                               {
  778.                                    savex++; i++;
  779.                               }
  780.                     }
  781.                } while( !eol );
  782.  
  783.                initstr[i]=NULL;
  784.                strcpy(term.init_cmd,initstr); // save to global
  785.  
  786. //               textbackground(BLUE);
  787. //               textcolor(WHITE);
  788.                textattr(0x1F);
  789.                window(1,14,80,14); clrscr();
  790.                window(1,17,80,17);
  791.                cputs_center( 1, "Do you wish to test the modem init string "
  792.                                  "[Y/N] ");
  793.                savex = wherex();
  794.                savey = wherey();
  795.                for (;;)
  796.                {
  797.                     gotoxy( savex, savey );
  798.                     clreol();
  799.                     ans=getche();
  800.                     if (ans == 'y' || ans =='Y' || ans == 'n' || ans == 'N')
  801.                     {
  802.                          clrscr();
  803.                          break;
  804.                     }
  805.                }
  806.  
  807.                if (ans == 'y' || ans == 'Y')
  808.                {
  809.                     ret=ValidInitStr(term.init_cmd,port);
  810.                     if ( ret == SUCCESS) break; // get out of for loop1
  811.                }
  812.                else
  813.                     break;  // get out of for loop1
  814.  
  815.                window(1,14,80,21);
  816.                cputs_center( 1, "Press ESC to go back" );
  817.                textcolor(YELLOW);
  818.           cputsxy(1,7,"  If you need assistance building a modem init string, "
  819.                       "please call customer");
  820.           cputsxy(1,8,"  service at 1-800-547-4727.");
  821.                textcolor(WHITE);
  822.  
  823.           }
  824.  
  825.      } while ( GetBaudRate() != SUCCESS );
  826.  
  827.      return SUCCESS;
  828. }
  829.  
  830. /**
  831. ***  ValidInitStr  --  check modem init string
  832. **/
  833. int ValidInitStr( char *init_str, char port)
  834. {
  835.      int  i, savex, savey, ans, com=0;
  836.      char temp[256];
  837.  
  838.      switch (port)
  839.      {
  840.           case '1': com = 1; break;
  841.           case '2': com = 2; break;
  842.           case '3': com = 3; break;
  843.           case '4': com = 4; break;
  844.      }
  845.  
  846.      window(1,14,80,21);
  847.      clrscr();
  848.      cputs_center(1,"Testing modem init string, please wait...");
  849.  
  850.      for (i=0; i < strlen(init_str); ++i)    // convert string to upper case
  851.           init_str[i] = toupper(init_str[i]);
  852.  
  853.      SearchModem(com, 2400, init_str);
  854.      if (strlen(modem_resp) == 0)
  855.           sprintf(temp,"Modem is not found or not ready");
  856.      else
  857.      {
  858.           if (!strcmp("AT\\S",init_str))
  859.                SearchModem(com, 2400, "ATE1Q0");
  860.           sprintf(temp,"Modem is responding with:");
  861.      }
  862.      // display modem response
  863. //     textbackground(BLUE);
  864. //     textcolor(YELLOW);
  865.      textattr(0x1E);
  866.      clrscr();
  867.      cputs_center(1,temp);
  868.      window(38,15,80,25);
  869.      cputs(modem_resp);
  870.  
  871.      window(1,24,80,25);
  872.      cputs_center( 1, "If modem responses with an 'OK', it indicates a valid "
  873.                       "init string");
  874.      textcolor(WHITE);
  875.      cputs_center( 2, "Continue [Y/N] ");
  876.      savex = wherex();
  877.      savey = wherey();
  878.      for (;;)
  879.      {
  880.           gotoxy( savex, savey );
  881.           clreol();
  882.           ans=getche();
  883.           if (ans == 'y' || ans =='Y' || ans == 'n' || ans == 'N')
  884.           {
  885.                window(1,14,80,25);
  886.                clrscr();
  887.                break;
  888.           }
  889.      }
  890.      if (ans == 'y' || ans == 'Y')
  891.           return SUCCESS;
  892.      else
  893.           return ERROR;
  894. }
  895.  
  896. /**
  897. ***  GetBaudRate  --  get baud rate for setting new entry
  898. **/
  899. int GetBaudRate( )
  900. {
  901.      int  savex, savey, ret;
  902.      int  i, port=0, is_modem, recommend, reset, eol;
  903.      long baudrate;
  904.      char temp[256];
  905.      do
  906.      {
  907.           switch (term.port_info[1])
  908.           {
  909.                case 0x01: port = 1; break;
  910.                case 0x02: port = 2; break;
  911.                case 0x03: port = 3; break;
  912.                case 0x04: port = 4; break;
  913.                default:   port = 0; break;
  914.           }
  915.  
  916.           is_modem = 0;
  917.           colorwindow( menu, BLUE, -1, 0 );
  918.           textcolor(WHITE);
  919.           cputs_center( 3, "Available speeds");
  920.           cputs_center( 4, "1. 1200  2. 2400  3. 4800  4. 9600  5. 19200");
  921.           sprintf(temp,"COM%d",port);
  922.           cputsxy(10,7,"Searching maximum speed for modem at ");
  923.           textcolor(YELLOW);
  924.           cputs(temp);
  925.           textcolor(WHITE);
  926.           cputs(", please wait...");
  927.  
  928.           no_cursor();
  929.           if (port > 0)
  930.           {
  931.                sprintf(temp,"AT");
  932.                reset = 0;
  933.                for (i=0;i<NUM_SPD_TYPE;++i)
  934.                {
  935.                     switch (i)
  936.                     {
  937.                          case 0: baudrate = 1200; break;
  938.                          case 1: baudrate = 2400; break;
  939.                          case 2: baudrate = 4800; break;
  940.                          case 3: baudrate = 9600; break;
  941.                          case 4: baudrate = 19200; break;
  942. //                         case 5: baudrate = 38400; break;
  943. //                         case 6: baudrate = 57600; break;
  944.                     }
  945.                     ret=SearchModem(port,baudrate,temp);
  946.                     if (ret)
  947.                     {
  948.                          if (ret != 1 && !reset)
  949.                          {
  950.                               sprintf(temp,"ATE1Q0");
  951.                               reset = 1;
  952.                               ret=SearchModem(port,baudrate,temp);
  953.                          }
  954.                          if (ret == 1)
  955.                          {
  956.                               if (!is_modem)
  957.                                    is_modem = 1;
  958.                               switch (i)
  959.                               {
  960.                                    case 0: recommend = 1; break;
  961.                                    case 1: recommend = 2; break;
  962.                                    case 2: recommend = 3; break;
  963.                                    case 3: recommend = 4; break;
  964.                                    case 4: recommend = 5; break;
  965.   //                                 case 5: recommend = 6; break;
  966.   //                                 case 6: recommend = 7; break;
  967.                               }
  968.                          }
  969.                     }
  970.                }
  971.           }
  972.           clr_line( 7 );
  973.           if (!is_modem)
  974.           {
  975.                textcolor(YELLOW);
  976.                cputs_center(7,"Modem is not found or not ready");
  977.           }
  978.           else
  979.           {
  980.                cputs_center(7,"Found maximum speed at: ");
  981.                textcolor(YELLOW);
  982.                switch (recommend)
  983.                {
  984.                     case 1: cputs("1200"); break;
  985.                     case 2: cputs("2400"); break;
  986.                     case 3: cputs("4800"); break;
  987.                     case 4: cputs("9600"); break;
  988.                     case 5: cputs("19200"); break;
  989.     //                case 6: cputs("38400"); break;
  990.     //                case 7: cputs("57600"); break;
  991.                }
  992.           }
  993.           textcolor(WHITE);
  994.           cputs_center(11, "Press ESC to go back");
  995.           cputs_center(13, "If you have  2400 bps modem ---------------------->> select speed option 2");
  996.           cputs_center(14, "If you have  2400 bps modem with V.42 or MNP5 ---->> select speed option 4");
  997.           cputs_center(15, "If you have  9600 bps modem ---------------------->> select speed option 4");
  998.           cputs_center(16, "If you have  9600 bps modem with V.24 or MNP5 ---->> select speed option 5");
  999.           cputs_center(17, "If you have 14400 bps modem ---------------------->> select speed option 5");
  1000.  //         textcolor(YELLOW);
  1001.  //         cputs_center(17, "NOTE: Most PCs can not handle speed greater than "
  1002.  //                          "19200");
  1003.  //         textcolor(WHITE);
  1004.           cputs_center( 9, "Pick a speed: ");
  1005.           savex = wherex();
  1006.           savey = wherey();
  1007.           window(savex,savey+6,savex+1,savey+6);
  1008. //          textbackground(RED);
  1009. //          textcolor(YELLOW);
  1010.           textattr(0x4E);
  1011.           savex = wherex();
  1012.           savey = wherey();
  1013.           i = eol = 0;
  1014.           do
  1015.           {
  1016.                gotoxy( savex, savey );
  1017.                clreol();
  1018.                if ( i == 1)
  1019.                {
  1020.                     temp[1]=NULL; cputsxy(1,1,temp);
  1021.                }
  1022.                temp[i] = getche();
  1023.                switch( temp[i] )
  1024.                {
  1025.                     case ESC : return (ERROR);
  1026.                     case RETURN :
  1027.                          if ( i > 0 )
  1028.                               if ( temp[0] >= '1' && temp[0] <= '7')
  1029.                                    eol = 1;
  1030.                          break;
  1031.                     case BACK_SPACE :
  1032.                          if ( i > 0)
  1033.                          {
  1034.                               savex--; i--;
  1035.                          }
  1036.                          break;
  1037.                     default:
  1038.                          if (i < 1)
  1039.                          {
  1040.                               savex++; i++;
  1041.                          }
  1042.                }
  1043.           } while ( !eol );
  1044.  
  1045.           if (temp[0] == '1')  term.port_info[0]=0x00;
  1046.           else if (temp[0] == '2') term.port_info[0]=0x01;
  1047.           else if (temp[0] == '3') term.port_info[0]=0x02;
  1048.           else if (temp[0] == '4') term.port_info[0]=0x03;
  1049.           else if (temp[0] == '5') term.port_info[0]=0x04;
  1050.           else if (temp[0] == '6') term.port_info[0]=0x05;
  1051.           else if (temp[0] == '7') term.port_info[0]=0x06;
  1052.  
  1053.           ret = GetNum(2);    // get phone list
  1054.           kill_data( file_buffer );
  1055.      } while (ret != SUCCESS);
  1056.  
  1057.      return ret;
  1058. }
  1059.  
  1060. /**
  1061. ***  --  PromptPhoneNum  --  prompt for phone number
  1062. **/
  1063. ///int PromptPhoneNum( )
  1064. ///{
  1065. ///     int savex, savey, ret;
  1066. ///
  1067. ///     window(1,23,80,23);
  1068. ///     cputs_center( 1, "   Examples: 222-5555 or 9,, 222-5555 or 1 6192225555 or "
  1069. ///                      "9,, 619-222-5555   ");
  1070. ///     window(1,24,80,24);
  1071. ///     cputsxy(15,1,"Enter phone number:  ");
  1072. ///
  1073. ///     savex = wherex();
  1074. ///     savey = wherey();
  1075. ///     gotoxy(savex,savey);
  1076. ///     for (;;)  // Get phone number
  1077. ///     {
  1078. ///          ret = GetPhoneStr(savex);
  1079. ///          if (ret == ERROR || ret == SUCCESS)
  1080. ///              break;
  1081. ///          else
  1082. ///          {
  1083. ///               window(1,25,80,25);
  1084. ///               textcolor(YELLOW);
  1085. ///               cputs_center( 1, "Invalid phone number.  Press any key");
  1086. ///               textcolor(WHITE);
  1087. ///               no_cursor();
  1088. ///               getch();
  1089. ///               clrscr();
  1090. ///          }
  1091. ///     }
  1092. ///     return ret;
  1093. ///}
  1094. ///
  1095. ////**
  1096. ///***  GetPhoneStr  --  get phone number string
  1097. ///**/
  1098. ///int GetPhoneStr(int x)
  1099. ///{
  1100. ///     int  savex, savey, i, j, eol;
  1101. ///     char phonestr[PHONE_NUM_LEN];
  1102. ///
  1103. ///     savex = x;
  1104. ///     i = eol = 0;
  1105. ///     window(savex,24,savex+PHONE_NUM_LEN-1,24);
  1106. /////     textbackground(RED);
  1107. /////     textcolor(YELLOW);
  1108. ///     textattr(0x4E);
  1109. ///     savex = wherex();
  1110. ///     savey = wherey();
  1111. ///     do {
  1112. ///          gotoxy( savex, savey );
  1113. ///          clreol();
  1114. ///          if ( i == PHONE_NUM_LEN-1 )
  1115. ///          {
  1116. ///               phonestr[PHONE_NUM_LEN-1]=NULL;
  1117. ///               cputsxy(1,1,phonestr);
  1118. ///          }
  1119. ///          phonestr[i] = getche() ;
  1120. ///          switch( phonestr[i] )
  1121. ///          {
  1122. ///               case ESC: return ERROR;
  1123. ///               case RETURN : eol = 1;  break;
  1124. ///               case BACK_SPACE :
  1125. ///                    if( i > 0 )
  1126. ///                    {
  1127. ///                         savex--; i--;
  1128. ///                    }
  1129. ///                    break;
  1130. ///               default :
  1131. ///                    if ( i < PHONE_NUM_LEN-1 )
  1132. ///                    {
  1133. ///                         savex++; i++;
  1134. ///                    }
  1135. ///          }
  1136. ///     } while( !eol );
  1137. ///     phonestr[i]=NULL;
  1138. ///     memset(term.phone_num,NULL,PHONE_NUM_LEN);
  1139. ///     for (i=0;i<strlen(phonestr);++i)   // save to global phone_num variable
  1140. ///          term.phone_num[i]=phonestr[i];
  1141. ///
  1142. /////     textbackground(BLUE);
  1143. /////     textcolor(WHITE);
  1144. ///     textattr(0x1F);
  1145. ///     if (ValidPhoneNum(term.phone_num) == INVALID)
  1146. ///          return INVALID;
  1147. ///     else
  1148. ///          return SUCCESS;
  1149. ///}
  1150. ///
  1151. ////**
  1152. ///***  --  ValidPhoneNum  --  check for valid phone number enter by user
  1153. ///**/
  1154. ///int ValidPhoneNum(char *phonestr)
  1155. ///{
  1156. ///     int  i, no_blank = 0;
  1157. ///
  1158. ///     if (strlen(phonestr) == 0)
  1159. ///          return INVALID;
  1160. ///
  1161. ///     for (i=0; i < strlen(phonestr); ++i)
  1162. ///     {
  1163. ///          if (!no_blank)
  1164. ///          {
  1165. ///               if (phonestr[i] != ' ')
  1166. ///                    no_blank = 1;
  1167. ///          }
  1168. ///          if (isalpha(phonestr[i]))
  1169. ///               return INVALID;
  1170. ///     }
  1171. ///     if (!no_blank) return INVALID;
  1172. ///     return SUCCESS;
  1173. ///}
  1174.  
  1175. /**
  1176. *** SetupFiles  --  create new setup file
  1177. **/
  1178. int SetupFiles( )
  1179. {
  1180.      FILE   *ddir, *curset, *cfg;
  1181.      int    ans, ret, i, savex, savey, filesize, is_pwd, entry_pos;
  1182.      char   temp[256];
  1183.      div_t  x;
  1184.  
  1185.      colorwindow( menu, BLUE, -1, 0 );
  1186.      textcolor(WHITE);
  1187.      if ((ddir = fopen("$$ddir.trm","at+")) == NULL)
  1188.      {
  1189.           cputs_center( 16, "Error %d openning file $$ddir.trm : %s",
  1190.                errno, sys_errlist[errno] );
  1191.           cputs_center( 17, "Press any key");
  1192.           no_cursor();
  1193.           getch();
  1194.           return ERROR;
  1195.      }
  1196.      if ((curset = fopen("$$curset.trm","wt+")) == NULL)
  1197.      {
  1198.           cputs_center( 16, "Error %d openning file $$curset.trm : %s",
  1199.                errno, sys_errlist[errno] );
  1200.           cputs_center( 17, "Press any key");
  1201.           fclose(ddir);
  1202.           no_cursor();
  1203.           getch();
  1204.           return ERROR;
  1205.      }
  1206.      if ((cfg = fopen("$$signup.cfg","rt")) == NULL)
  1207.      {
  1208.           cputs_center( 16, "Error %d openning file $$signup.cfg : %s",
  1209.                errno, sys_errlist[errno] );
  1210.           cputs_center( 17, "Press any key");
  1211.           fclose(ddir);
  1212.           fclose(curset);
  1213.           no_cursor();
  1214.           getch();
  1215.           clr_line( 16 );
  1216.           return ERROR;
  1217.      }
  1218.  
  1219.      /* write new entry info to $$ddir.trm */
  1220.      for (i=0;i<SETUP_NAME_LEN;++i)           // write setup name
  1221.           fputc(term.setup_name[i],ddir);
  1222.  
  1223.      for (i=0;i<PHONE_NUM_LEN;++i)           // write phone number
  1224.           fputc(term.phone_num[i],ddir);
  1225.  
  1226.      for (i=0;i<INIT_CMD_LEN;++i)            // write modem init command
  1227.           fputc(term.init_cmd[i],ddir);
  1228.  
  1229.                                         // speed set in GetBaudRate()
  1230.                                         // com port set in GetComPort()
  1231.      term.port_info[2]=0x01;            // default connection x25
  1232.      term.port_info[3]=0x01;            // default dialing = tone
  1233.      term.port_info[4]=0x01;            // default speaker = on
  1234.      term.port_info[5]=0x01;            // ???
  1235.      switch( term.port_info[1] )
  1236.      {
  1237.           case 0x01:
  1238.                term.port_info[6]=0x04;       // irq number
  1239.                term.port_info[7]=0xF8;       // port address
  1240.                term.port_info[8]=0x03;
  1241.                break;
  1242.           case 0x02:
  1243.                term.port_info[6]=0x03;
  1244.                term.port_info[7]=0xF8;
  1245.                term.port_info[8]=0x02;
  1246.                break;
  1247.           case 0x03:
  1248.                term.port_info[6]=0x04;
  1249.                term.port_info[7]=0xE8;
  1250.                term.port_info[8]=0x03;
  1251.                break;
  1252.           case 0x04:
  1253.                term.port_info[6]=0x03;
  1254.                term.port_info[7]=0xE8;
  1255.                term.port_info[8]=0x02;
  1256.                break;
  1257.           default:
  1258.                term.port_info[6]=0x00;
  1259.                term.port_info[7]=0x00;
  1260.                term.port_info[8]=0x00;
  1261.                break;
  1262.  
  1263.      }
  1264.      for (i=0;i<PORT_INFO_LEN;++i)                // write port information
  1265.           fputc(term.port_info[i],ddir);
  1266.  
  1267.      for (i=0;i<ID_LEN;++i)                       // write id name or number
  1268.           fputc(term.id[i],ddir);
  1269.  
  1270.      for (i=0;i<PWD_LEN;++i)                       // write password
  1271.           fputc(term.pwd[i],ddir);
  1272.  
  1273.      term.x25_type[0] = 0x00;                // default carrier is 1st entry
  1274.      term.x25_type[1] = 0x00;
  1275.      for (i=0;i<X25_TYPE_LEN;++i)            // write x25 information
  1276.           fputc(term.x25_type[i],ddir);      // write x25 carrier
  1277.                                              // write x25 host name
  1278.      for (i=0; i < 8; ++i)
  1279.           fgets(temp,MAX_LINE_LEN,cfg);           // get x25 host name
  1280.      PutStr(temp,term.x25_host,X25_HOST_LEN,ddir);
  1281.  
  1282.      for (i=0;i<X25_PWD_LEN;++i)             // password is empty
  1283.           fputc(term.x25_pwd[i],ddir);       // not required
  1284.  
  1285.      for (i=0;i<UNDEFINED_FLD_LEN;++i)           // undefined field
  1286.           fputc(term.undefined_fld[i],ddir);
  1287.  
  1288.      fseek(ddir, 0, SEEK_SET);               // goto beginning of file
  1289.      filesize = 0;
  1290.      while (fgetc(ddir) != EOF)              // get size of file
  1291.           ++filesize;
  1292.      x = div(filesize,sizeof(term_s));       // divide by sizeof a entry
  1293.      entry_pos = x.quot - 1;                 // to get number of entries,
  1294.                                              // subtract 1 to get the
  1295.      fputc(entry_pos,curset);                // positon of the new entry
  1296.      // write new info to $$curset.trm file
  1297.      for (i=1;i<CURSET_LEN;++i)
  1298.           fputc(NULL,curset);
  1299.  
  1300.      fclose(curset);
  1301.      fclose(ddir);
  1302.      fclose(cfg);
  1303.      return SUCCESS;
  1304. }
  1305.  
  1306. /**
  1307. ***  PutStr  --  copy string and put to a file
  1308. **/
  1309. void PutStr(char *source, char *destination, int dest_len, FILE *fp)
  1310. {
  1311.      int i;
  1312.      for (i=0;i<strlen(source);++i)
  1313.           if (!(source[i] == '\n' || i == dest_len))
  1314.                destination[i]=source[i];
  1315.      for (i=0;i<dest_len-1;++i)
  1316.           fputc(destination[i],fp);
  1317.      fputc(NULL,fp);
  1318. }
  1319.  
  1320.  
  1321.  
  1322. /**
  1323. ***  Info  --  display  file in scrollable window
  1324. **/
  1325. int Info(int found)
  1326. {
  1327.      int start = 0, ret, savex, savey, key=0;
  1328.      char temp[MAX_LINE_LEN+1];
  1329.      window( 1, 7, 80, 24 );
  1330.      clrscr();
  1331.      textcolor( YELLOW );
  1332.      cputs_center(1, "Use cursor keys to scroll text.  Press ESC to go back.");
  1333.      window( 1, 8, 80, 25 );
  1334.  
  1335.      if ( !found )
  1336.      if ( !found )
  1337.      {
  1338.           sprintf(temp," No phone number found for this area code: %s ",area_code);
  1339.           cputs_center(17, temp);
  1340.      }
  1341.  
  1342.      textcolor( WHITE );
  1343.      start = Display( start, 0 );
  1344.      no_cursor();
  1345.  
  1346.      for( ;; )
  1347.      {
  1348.           while( bioskey( 1 ) == 0 );   /** wait for a key  **/
  1349.           key = bioskey( 0 );
  1350.           switch( key )
  1351.           {
  1352.           case UP:      /**  display previous line    **/
  1353.                if( start <= LINES_PER_SCREEN ) break;
  1354.                start = Display( ( start - LINES_PER_SCREEN ) - 1, 0 );
  1355.                break;
  1356.  
  1357.           case DOWN:    /**  display next line        **/
  1358.                if( start >= num_lines ) break;
  1359.                start = Display( ( start - LINES_PER_SCREEN ) + 1, 0 );
  1360.                break;
  1361.  
  1362.           case PGUP:         /**  display prev page        **/
  1363.                if( start <= LINES_PER_SCREEN ) break;
  1364.                start = Display( start - ( LINES_PER_SCREEN * 2 ), 0 );
  1365.                break;
  1366.  
  1367.           case PGDN:       /**  display next page        **/
  1368.                if( start >= num_lines ) break;
  1369.                start = Display( start - 1, 0 );
  1370.                break;
  1371.  
  1372.           case HOME:          /**  go to top                **/
  1373.                if( start <= LINES_PER_SCREEN ) break;
  1374.                start = Display( 0, 0 );
  1375.                break;
  1376.  
  1377.           case END:           /**  go to end                **/
  1378.                if( start >= num_lines ) break;
  1379.                start = Display( num_lines - LINES_PER_SCREEN, 0 );
  1380.                break;
  1381.  
  1382.           case ESC_SCAN:
  1383.           case CTRL_C:
  1384.                clr_line( 18 );
  1385.                window( 1, 1, 80, 25 );
  1386.                return ERROR;
  1387.           }  /**  END-SWITCH  key  **/
  1388.           no_cursor();
  1389.      }
  1390. }
  1391.  
  1392.  
  1393. /**
  1394. ***  Info2  --  display  file in scrollable window
  1395. **/
  1396. int Info2(int found)
  1397. {
  1398.      int start = 0, ret, savex, savey, key=0;
  1399.      int positiony=TOP_OFFSET;  // offset from the top of the screen
  1400.      int line_num;
  1401.      char temp[MAX_LINE_LEN+1];
  1402.  
  1403.      window( 1, 7, 80, 24 );
  1404.      clrscr();
  1405.      textcolor( YELLOW );
  1406.  
  1407.      if ( found )
  1408.           cputs_center( 1, "Use %c %c keys to select phone number then "
  1409.                            "press ENTER.  Press ESC to go back",0x18,0x19);
  1410.      else
  1411.      {
  1412.           cputs_center( 1, "Use %c %c keys to scroll.  Press Esc to go "
  1413.                            "back",0x18,0x19);
  1414.           cputs_center(17, "Go back try again.");
  1415.  
  1416.      }
  1417.      cputs_center(16,"=================================================="
  1418.                      "===========================");
  1419.  
  1420.      window( 1, 8, 80, 25);
  1421.  
  1422.      if ( !found )
  1423.      {
  1424.           sprintf(temp," No phone number found for this area code: %s ",area_code);
  1425.           cputs_center(15, temp);
  1426.      }
  1427.  
  1428.      textcolor( WHITE );
  1429.      start = Display( start, BOTTOM_OFFSET );
  1430.      line_num = 1;
  1431.      HighliTxt(line_num,positiony,RED,YELLOW);
  1432.      no_cursor();
  1433.  
  1434.      for( ;; )
  1435.      {
  1436.           while( bioskey( 1 ) == 0 );   /** wait for a key  **/
  1437.           key = bioskey( 0 );
  1438.           switch( key )
  1439.           {
  1440.           case UP:      /**  display previous line    **/
  1441.                if (positiony-TOP_OFFSET>0 && positiony-TOP_OFFSET <= (LINES_PER_SCREEN-BOTTOM_OFFSET))
  1442.                {
  1443.                          --line_num;
  1444.                          --positiony;
  1445.                          HighliTxt(line_num+1,positiony+1,BLUE,WHITE);
  1446.                          HighliTxt(line_num,positiony,RED,YELLOW);
  1447.                }
  1448.                else
  1449.                {
  1450.                     if( start <= (LINES_PER_SCREEN-BOTTOM_OFFSET) )
  1451.                          break;
  1452.                     window( 1, TOP_OFFSET, 80, 25-BOTTOM_OFFSET );
  1453. //                    textbackground(BLUE);
  1454. //                    textcolor(WHITE);
  1455.                     textattr(0x1F);
  1456.                     clrscr();
  1457.                     start = Display((start-(LINES_PER_SCREEN-BOTTOM_OFFSET))-1,BOTTOM_OFFSET);
  1458.                     --line_num;
  1459.                     HighliTxt(line_num,positiony,RED,YELLOW);
  1460.                }
  1461.                break;
  1462.  
  1463.           case DOWN:    /**  display next line        **/
  1464.                if (positiony-TOP_OFFSET < (LINES_PER_SCREEN-BOTTOM_OFFSET) - 1)
  1465.                {
  1466.                     if (positiony-TOP_OFFSET < num_lines-1)
  1467.                     {
  1468.                          ++line_num;
  1469.                          ++positiony;
  1470.                          HighliTxt(line_num-1,positiony-1,BLUE,WHITE);
  1471.                          HighliTxt(line_num,positiony,RED,YELLOW);
  1472.                     }
  1473.                }
  1474.                else
  1475.                {
  1476.                     if( start >= num_lines )
  1477.                           break;
  1478.                     window( 1, TOP_OFFSET, 80, 25-BOTTOM_OFFSET );
  1479. //                    textbackground(BLUE);
  1480. //                    textcolor(WHITE);
  1481.                     textattr(0x1F);
  1482.                     clrscr();
  1483.                     start = Display((start-(LINES_PER_SCREEN-BOTTOM_OFFSET))+1,BOTTOM_OFFSET);
  1484.                     ++line_num;
  1485.                     HighliTxt(line_num,positiony,RED,YELLOW);
  1486.                }
  1487.                break;
  1488.  
  1489.           case INFO_RETURN: // RETURN
  1490.                if ( !found )
  1491.                {
  1492. ///                    window(1,22,80,24);
  1493. /////                    textbackground(BLUE);
  1494. /////                    textcolor(WHITE);
  1495. ///                    textattr(0x1F);
  1496. ///                    ret = PromptPhoneNum();
  1497. ///                    return ret;
  1498.                }
  1499.                else
  1500.                {
  1501.                     ret = SelectedTxt(line_num, positiony);
  1502.                     if (ret != INVALID)
  1503.                          return ret;
  1504.                }
  1505.                break;
  1506.           case ESC_SCAN:
  1507.           case CTRL_C:
  1508.                clr_line( 18 );
  1509.                window( 1, 1, 80, 25 );
  1510.                return ERROR;
  1511.           }  /**  END-SWITCH  key  **/
  1512.           no_cursor();
  1513.      }
  1514. }
  1515.  
  1516. /**
  1517. ***  GetNum  --  prompt for area code and display num
  1518. **/
  1519. int GetNum( int info1_2 )
  1520. {
  1521.      char num[6], code[4], **ptr, **buf_ptr, line[MAX_LINE_LEN+1];
  1522.      int savex, savey, i, eol;
  1523.      int ans, found, ret;
  1524.  
  1525.      do
  1526.      {
  1527. //          found=0;
  1528.           colorwindow( menu, BLUE, -1, 0 );
  1529.           textcolor(WHITE);
  1530.           i = eol = 0;
  1531.           cputs_center( 7, "Press ESC to go back" );
  1532.           cputs_center( 5, "Enter your 3 digit Area Code : " );
  1533.           savex = wherex();
  1534.           savey = wherey();
  1535.           window(savex,savey+6,savex+3,savey+6);
  1536. //          textbackground(RED);
  1537. //          textcolor(YELLOW);
  1538.           textattr(0x4E);
  1539.           savex = wherex();
  1540.           savey = wherey();
  1541.           do {
  1542.                gotoxy( savex, savey );
  1543.                clreol();
  1544.                if ( i == 3 )
  1545.                {
  1546.                     code[3]=NULL; cputsxy(1,1,code);
  1547.                }
  1548.                code[i] = getche() ;
  1549.                switch( code[i] )
  1550.                {
  1551.                     case ESC : return ERROR;
  1552.                     case RETURN :
  1553.                          if ( i > 2 )
  1554.                               eol = 1;
  1555.                          break;
  1556.                     case BACK_SPACE :
  1557.                          if( i > 0 )
  1558.                          {
  1559.                               savex--; i--;
  1560.                          }
  1561.                          break;
  1562.                     default :
  1563.                          if( i < 3 )
  1564.                          {
  1565.                               savex++; i++;
  1566.                          }
  1567.                }
  1568.           } while( !eol );
  1569.           code[3] = NULL;
  1570.           sprintf( num, " %.3s ", code );
  1571.  
  1572.           strcpy(area_code,code);
  1573.  
  1574.           ret = GetLocalPhone(num, info1_2);
  1575.      } while (ret != SUCCESS);
  1576.  
  1577.      return SUCCESS;
  1578. }
  1579.  
  1580.  
  1581. int GetLocalPhone(char *num, int info1_2 )
  1582. {
  1583.      char code[4], **ptr, **buf_ptr, line[MAX_LINE_LEN+1];
  1584.      int savex, savey, i, eol;
  1585.      int ans, found, ret;
  1586.  
  1587.  
  1588.      do
  1589.      {
  1590.           found = 0;
  1591.           no_cursor();
  1592. //          sprintf( num, " %.3s ", code );
  1593. //          strcpy(area_code,num);
  1594.           if( GetFile( PHONE_FILE ) <= 0 )
  1595.                return ERROR;
  1596.  
  1597.           buf_ptr = ptr = file_buffer;
  1598.           num_lines = 0;
  1599.  
  1600. //          textbackground(BLUE);
  1601. //          textcolor(WHITE);
  1602.           textattr(0x1F);
  1603.           while( *ptr )
  1604.           {
  1605.                if( strstr( *ptr, "--" ) != NULL || strstr( *ptr, num ) != NULL )
  1606.                {
  1607.                     if ( !found && strstr(*ptr,num) != NULL )
  1608.                          found = 1;
  1609.                     *buf_ptr = (char*)realloc( *buf_ptr, strlen( *ptr ) + 1 );
  1610.                     strcpy( *buf_ptr, *ptr );
  1611.                     buf_ptr++;
  1612.                     num_lines++;
  1613.                }
  1614.                ptr++;
  1615.           }
  1616.           /**buf_ptr = (char*) NULL;*/
  1617.           if (info1_2 == 2)
  1618.           {
  1619.                ret = Info2( found );
  1620.                if (ret == ERROR || !found) break;
  1621.           }
  1622.           else
  1623.           {
  1624.                ret = Info( found );
  1625.                break;
  1626.           }
  1627.      } while (ret != SUCCESS);
  1628.  
  1629.      return ret;
  1630. }
  1631.  
  1632. /**
  1633. ***  GetNum  --  prompt for area code and display num
  1634. **/
  1635. ///int GetNum( int info1_2 )
  1636. ///{
  1637. ///     char num[6], code[4], **ptr, **buf_ptr, line[MAX_LINE_LEN+1];
  1638. ///     int savex, savey, i, eol;
  1639. ///     int ans, found, ret;
  1640. ///
  1641. ///     do
  1642. ///     {
  1643. ///          found=0;
  1644. ///          colorwindow( menu, BLUE, -1, 0 );
  1645. ///          textcolor(WHITE);
  1646. ///          i = eol = 0;
  1647. ///          cputs_center( 7, "Press ESC to go back" );
  1648. ///          cputs_center( 5, "Enter your 3 digit Area Code : " );
  1649. ///          savex = wherex();
  1650. ///          savey = wherey();
  1651. ///          window(savex,savey+6,savex+3,savey+6);
  1652. /////          textbackground(RED);
  1653. /////          textcolor(YELLOW);
  1654. ///          textattr(0x4E);
  1655. ///          savex = wherex();
  1656. ///          savey = wherey();
  1657. ///          do {
  1658. ///               gotoxy( savex, savey );
  1659. ///               clreol();
  1660. ///               if ( i == 3 )
  1661. ///               {
  1662. ///                    code[3]=NULL; cputsxy(1,1,code);
  1663. ///               }
  1664. ///               code[i] = getche() ;
  1665. ///               switch( code[i] )
  1666. ///               {
  1667. ///                    case ESC : return ERROR;
  1668. ///                    case RETURN :
  1669. ///                         if ( i > 2 )
  1670. ///                              eol = 1;
  1671. ///                         break;
  1672. ///                    case BACK_SPACE :
  1673. ///                         if( i > 0 )
  1674. ///                         {
  1675. ///                              savex--; i--;
  1676. ///                         }
  1677. ///                         break;
  1678. ///                    default :
  1679. ///                         if( i < 3 )
  1680. ///                         {
  1681. ///                              savex++; i++;
  1682. ///                         }
  1683. ///               }
  1684. ///          } while( !eol );
  1685. ///          no_cursor();
  1686. ///
  1687. ///          sprintf( num, " %.3s ", code );
  1688. ///          if( GetFile( PHONE_FILE ) <= 0 )
  1689. ///               return ERROR;
  1690. ///
  1691. ///          buf_ptr = ptr = file_buffer;
  1692. ///          num_lines = 0;
  1693. ///
  1694. /////          textbackground(BLUE);
  1695. /////          textcolor(WHITE);
  1696. ///          textattr(0x1F);
  1697. ///          while( *ptr )
  1698. ///          {
  1699. ///               if( strstr( *ptr, "--" ) != NULL || strstr( *ptr, num ) != NULL )
  1700. ///               {
  1701. ///                    if ( !found && strstr(*ptr,num) != NULL )
  1702. ///                         found = 1;
  1703. ///                    *buf_ptr = (char*)realloc( *buf_ptr, strlen( *ptr ) + 1 );
  1704. ///                    strcpy( *buf_ptr, *ptr );
  1705. ///                    buf_ptr++;
  1706. ///                    num_lines++;
  1707. ///               }
  1708. ///               ptr++;
  1709. ///          }
  1710. ///          /**buf_ptr = (char*) NULL;*/
  1711. ///          if (info1_2 == 2)
  1712. ///               ret = Info2( found );
  1713. ///          else
  1714. ///               ret = Info( found );
  1715. ///     } while (ret != SUCCESS);
  1716. ///     return SUCCESS;
  1717. ///}
  1718.  
  1719.  
  1720. void HighliTxt(int line_number, int positiony, int bgcolor, int txtcolor)
  1721. {
  1722.      char **ptr;
  1723.      char str[100];
  1724.      window(2,positiony,39,positiony);
  1725.      textbackground(bgcolor);
  1726.      clrscr();
  1727.      window(2,positiony,40,positiony);
  1728.      textcolor(txtcolor);
  1729.      ptr = file_buffer + (line_number - 1);
  1730.      strcpy(str,*ptr);
  1731.      if (str[strlen(str)-1] == '\n' || str[strlen(str)-1] == '\r')
  1732.           str[strlen(str)-1] = '\0';
  1733.      if (str[strlen(str)-2] == '\r' || str[strlen(str)-2] == '\n')
  1734.           str[strlen(str)-2] = '\0';
  1735.      cputsxy(1,1,"%s",str);
  1736. }
  1737.  
  1738. int SelectedTxt(int line_number, int y)
  1739. {
  1740.      int i, j, savex;
  1741.      char **ptr, str[100], ch;
  1742.  
  1743.      ptr = file_buffer + (line_number - 1);
  1744.      strcpy(str,*ptr);
  1745.      if ( strstr(*ptr,"--") != NULL)
  1746.           return INVALID;
  1747.  
  1748.      HighliTxt(line_number,y,CYAN,YELLOW);
  1749.  
  1750.      j = 0;
  1751.      memset(term.phone_num,NULL,PHONE_NUM_LEN);
  1752.      for (i=30; i < 38; ++i)
  1753.           term.phone_num[j++] = str[i];
  1754.      window(1,23,80,24);
  1755. //     textbackground(BLUE);
  1756. //     textcolor(WHITE);
  1757.      textattr(0x1F);
  1758.      cputsxy(24,1,"Selected phone number: ");
  1759.      savex=wherex();
  1760.  
  1761. //     textbackground(RED); textcolor(YELLOW);
  1762.      textattr(0x4E);
  1763.      window(savex,23,savex+strlen(term.phone_num),23);
  1764.      cputs(term.phone_num);
  1765.  
  1766.      window(1,25,80,25);
  1767. //     textbackground(BLUE); textcolor(WHIE);
  1768.      textattr(0x1F);
  1769.      cputs_center(1,"Press ENTER to continue or ESC to go back");
  1770.      do
  1771.      {
  1772.           no_cursor();
  1773.           ch=getch();
  1774.      } while ( ch != ESC && ch != RETURN );
  1775.      clrscr();
  1776.      if (ch == ESC)
  1777.           return ERROR2;
  1778.      return SUCCESS;
  1779. }
  1780.  
  1781. /**
  1782. ***  Display  --  displays NUM_LINES_PER_SCREEN of readme starting at start
  1783. **/
  1784. int Display( int start, int bottom )
  1785. {
  1786.      int i, y = 1;
  1787.      char **ptr;
  1788.  
  1789.      if( start < 0 )          /**  at begining of array     **/
  1790.           start = 0;
  1791.      if( start + (LINES_PER_SCREEN-bottom) > num_lines )   /**  at end of array     **/
  1792.      {
  1793.           if(( start = num_lines - (LINES_PER_SCREEN-bottom) ) < 0 )
  1794.                start = 0 ;
  1795.      }
  1796.      /*clrscr();*/
  1797.  
  1798.      ptr = file_buffer + start;
  1799.      for( i = start; i < (LINES_PER_SCREEN-bottom) + start && i < num_lines; i++ )
  1800.      {
  1801.           gotoxy( 2, y++ );
  1802.           clreol();
  1803.           if( !*ptr )
  1804.                break;
  1805.           cputs( *ptr++ );
  1806.      }
  1807.      return( i );
  1808. }
  1809.  
  1810. /**
  1811. ***  GetFile
  1812. **/
  1813. int GetFile( char *filename )
  1814. {
  1815.      int ret;
  1816.  
  1817.      ret = LoadFile( filename );
  1818.      if( ret <= 0 )
  1819.      {
  1820.           colorwindow( menu, BLUE, -1, 0 );
  1821.           textcolor(WHITE);
  1822.           if( ret == 0 )
  1823.                cputs_center( 5, "ERROR : empty file : %s", filename );
  1824.           else
  1825.           {
  1826.                if( ret == -1 )
  1827.                     cputs_center( 5, "ERROR : opening %s : %s", filename,
  1828.                          sys_errlist[ errno ] );
  1829.                else
  1830.                     cputs_center( 5, "ERROR : not enough memory to display text" );
  1831.           }
  1832.           cputs_center(7, "Press any key");
  1833.           getch();
  1834.           window( 1, 1, 80, 25 );
  1835.           return ret;
  1836.      }
  1837.      return( ret );
  1838. }
  1839.  
  1840. /**
  1841. ***  LoadFile  --  loads readme file into pointers
  1842. **/
  1843. int LoadFile( char *fname )
  1844. {
  1845.      FILE *fp;
  1846.      char **ptr, buf[MAX_LINE_LEN+1];
  1847.  
  1848.      if(( fp = fopen( fname, "rb" )) == NULL )
  1849.           return( -1 );       /**  file not found  **/
  1850.  
  1851.  
  1852.      if(( ptr = file_buffer = (char**) calloc( MAX_LINES + 1, sizeof(char*) )) == NULL )
  1853.           return( -2 );
  1854.      num_lines = 0;
  1855.      for( ;; )
  1856.      {
  1857.           if( fgets( buf, sizeof(buf), fp ) == (char*)NULL )
  1858.                break;         /**  end of file or error  **/
  1859.           if(( *ptr = strdup( buf )) == (char*) NULL )
  1860.                return( -2 );  /**  error allocating  **/
  1861.           ptr++;
  1862.           num_lines++;
  1863.      }
  1864.      *ptr = (char*) NULL;
  1865.  
  1866.      fclose( fp );
  1867.      return( num_lines );
  1868. }
  1869.  
  1870. /**
  1871. ***  kill_data  --  kills data alloctated to pointers
  1872. **/
  1873. void kill_data( char **data )
  1874. {
  1875.      char **p = data;
  1876.      if( !data )
  1877.         return;
  1878.      while( *data )
  1879.      {
  1880.         free( *data );
  1881.         *data++ = (char*)NULL;
  1882.      }
  1883.  
  1884.      free( p );
  1885.      p = (char**) NULL;
  1886. }
  1887. /**  EOF : signup.c  **/
  1888.